package Negocios;

import CDB.Empleados;
import CDB.PersonFactory;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author ISC Erick
 */
public class ControlEmployee {

    public SessionFactory sessionFactory = null;

    public ControlEmployee() {
    }

    public List selectAll() {
        List list = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los empleados
            list = session.createQuery("from Empleados e").list();
            session.close();
            //Retorno la lista con todos los empleados
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return list;
    }

    public Empleados selectOne(int id) {
        Empleados emp = null;
        try {
            Session session = createSession();
            emp = (Empleados) session.createQuery("from Empleados e where e.idempleado=" + id).list().get(0);
            session.close();

        } catch (IndexOutOfBoundsException e) {
            throw e;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return emp;
    }

    public Empleados selectOneByName(String name) {
        Empleados emp = null;
        try {
            Session session = createSession();
            List list = session.createQuery("from Empleados e where e.nombre='" + name + "'").list();
            emp = (Empleados) list.get(0);
            session.close();
        } catch (Exception e) {
            throw e;
        }
        return emp;
    }

    public void add(String nombre, String direccion, String telefono,
            Date fecha, List permisos, String password) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Empleados employee = new Empleados();

            //construir el empleado apartir de los datos proporcionados
            employee.setNombre(nombre);
            employee.setDireccion(direccion);
            employee.setTelefono(telefono);
            employee.setFechacontratacion(fecha);
            employee.setPassword(password);
            //Guardar la el empleado mandado
            session.save(employee);
            //Si no a ocurrido un error 
            tx.commit();

            //Guardar los permisos del empleado
            Transaction tx2 = session.beginTransaction();
            ControlPermissions cp = new ControlPermissions();
            ControlEmployee ce = new ControlEmployee();
            employee = ce.getLast();

            //crear el objeto de permisos
            cp.add((boolean) permisos.get(0), (boolean) permisos.get(1),
                    (boolean) permisos.get(2), (boolean) permisos.get(3),
                    (boolean) permisos.get(4), (boolean) permisos.get(5),
                    (boolean) permisos.get(6), (boolean) permisos.get(7),
                    (boolean) permisos.get(8), (boolean) permisos.get(9),
                    (boolean) permisos.get(10), (boolean) permisos.get(11),
                    (boolean) permisos.get(12), (boolean) permisos.get(13),
                    employee,
                    (boolean) permisos.get(14), (boolean) permisos.get(15),
                    (boolean) permisos.get(16), (boolean) permisos.get(17),
                    (boolean) permisos.get(18), (boolean) permisos.get(19),
                    (boolean) permisos.get(20), (boolean) permisos.get(21),
                    (boolean) permisos.get(22), (boolean) permisos.get(23),
                    (boolean) permisos.get(24), (boolean) permisos.get(25));

            //si todo salio bien guardamos en la base de datos
            tx2.commit();

            //terminando la sesion
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }

    }

    public void update(String nombre, String direccion, String telefono,
            Date fecha, List permisos, String password, int idPermisos) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Empleados employee = selectOneByName(nombre);

            //construir el empleado apartir de los datos proporcionados
            employee.setNombre(nombre);
            employee.setDireccion(direccion);
            employee.setTelefono(telefono);
            employee.setFechacontratacion(fecha);
            employee.setPassword(password);
            //Operacion hibernate para borrar un registro
            session.update(employee);
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            //Guardar los permisos del empleado
            Transaction tx2 = session.beginTransaction();
            ControlPermissions cp = new ControlPermissions();

            //actualizar el objeto de permisos
            cp.update(idPermisos, (boolean) permisos.get(0), (boolean) permisos.get(1),
                    (boolean) permisos.get(2), (boolean) permisos.get(3),
                    (boolean) permisos.get(4), (boolean) permisos.get(5),
                    (boolean) permisos.get(6), (boolean) permisos.get(7),
                    (boolean) permisos.get(8), (boolean) permisos.get(9),
                    (boolean) permisos.get(10), (boolean) permisos.get(11),
                    (boolean) permisos.get(12), (boolean) permisos.get(13),
                    employee,
                    (boolean) permisos.get(14), (boolean) permisos.get(15),
                    (boolean) permisos.get(16), (boolean) permisos.get(17),
                    (boolean) permisos.get(18), (boolean) permisos.get(19),
                    (boolean) permisos.get(20), (boolean) permisos.get(21),
                    (boolean) permisos.get(22), (boolean) permisos.get(23),
                    (boolean) permisos.get(24), (boolean) permisos.get(25));

            //si todo salio bien guardamos en la base de datos
            tx2.commit();
            //cerrar sesion
            session.close();
        } catch (Exception e) {
            throw e;
        }
    }

    public void update(String nombre, String direccion, String telefono,
            Date fecha, String password, int idEmpleado) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            Empleados employee = selectOne(idEmpleado);

            //construir el empleado apartir de los datos proporcionados
            employee.setNombre(nombre);
            employee.setDireccion(direccion);
            employee.setTelefono(telefono);
            employee.setFechacontratacion(fecha);
            employee.setPassword(password);

            //Operacion hibernate para borrar un registro
            session.update(employee);
            session.refresh(employee);
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            throw e;
        }
    }

    public void delete(int id) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();

            //Operacion hibernate para borrar un registro
            Empleados employee = new Empleados();
            employee.setIdempleado(id);
            session.delete(employee);

            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public void deleteByEmpleado(Empleados employee) {
        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            //Operacion hibernate para borrar un registro
            session.delete(employee);
            //Si no ocurrio error hago comit y termino la session
            tx.commit();
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
    }

    public Empleados getLast() {
        Empleados empleado;
        List lstEmpleado;
        try {
            Session session;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            String consulta = "from Empleados order by idempleado desc";
            lstEmpleado = session.createQuery(consulta).setMaxResults(1).list();
            empleado = (Empleados) lstEmpleado.get(0);
            session.flush();
            session.close();
            return empleado;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de empleado.", "Error al crear Session",
                    0);
            session.close();
        }
        return session;
    }
}
